/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Fair Isaac Corporation <Hemant.Singh@Gmail.com> - Bug 326695 *******************************************************************************/ package org.eclipse.ui.model; import org.eclipse.core.runtime.Adapters; import org.eclipse.jface.resource.ColorDescriptor; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.StyledString.Styler; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.PlatformUI; /** * Provides basic labels for adaptable objects that have the * <code>IWorkbenchAdapter</code> adapter associated with them. All dispensed * images are cached until the label provider is explicitly disposed. * This class provides a facility for subclasses to define annotations * on the labels and icons of adaptable objects. */ public class WorkbenchLabelProvider extends LabelProvider implements IColorProvider, IFontProvider, IStyledLabelProvider { /** * Returns a workbench label provider that is hooked up to the decorator * mechanism. * * @return a new <code>DecoratingLabelProvider</code> which wraps a <code> * new <code>WorkbenchLabelProvider</code> */ public static ILabelProvider getDecoratingWorkbenchLabelProvider() { return new DecoratingLabelProvider(new WorkbenchLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager() .getLabelDecorator()); } /** * Listener that tracks changes to the editor registry and does a full update * when it changes, since many workbench adapters derive their icon from the file * associations in the registry. */ private IPropertyListener editorRegistryListener = (source, propId) -> { if (propId == IEditorRegistry.PROP_CONTENTS) { fireLabelProviderChanged(new LabelProviderChangedEvent(WorkbenchLabelProvider.this)); } }; private ResourceManager resourceManager; /** * Creates a new workbench label provider. */ public WorkbenchLabelProvider() { PlatformUI.getWorkbench().getEditorRegistry().addPropertyListener(editorRegistryListener); } /** * Returns an image descriptor that is based on the given descriptor, * but decorated with additional information relating to the state * of the provided object. * * Subclasses may reimplement this method to decorate an object's * image. * * @param input The base image to decorate. * @param element The element used to look up decorations. * @return the resuling ImageDescriptor. * @see org.eclipse.jface.resource.CompositeImageDescriptor */ protected ImageDescriptor decorateImage(ImageDescriptor input, Object element) { return input; } /** * Returns a label that is based on the given label, * but decorated with additional information relating to the state * of the provided object. * * Subclasses may implement this method to decorate an object's * label. * @param input The base text to decorate. * @param element The element used to look up decorations. * @return the resulting text */ protected String decorateText(String input, Object element) { return input; } @Override public void dispose() { PlatformUI.getWorkbench().getEditorRegistry().removePropertyListener(editorRegistryListener); if (resourceManager != null) resourceManager.dispose(); resourceManager = null; super.dispose(); } /** * Returns the implementation of IWorkbenchAdapter for the given * object. * @param o the object to look up. * @return IWorkbenchAdapter or<code>null</code> if the adapter is not defined or the * object is not adaptable. */ protected final IWorkbenchAdapter getAdapter(Object o) { return Adapters.adapt(o, IWorkbenchAdapter.class); } /** * Returns the implementation of IWorkbenchAdapter2 for the given * object. * @param o the object to look up. * @return IWorkbenchAdapter2 or<code>null</code> if the adapter is not defined or the * object is not adaptable. */ protected final IWorkbenchAdapter2 getAdapter2(Object o) { return Adapters.adapt(o, IWorkbenchAdapter2.class); } /** * Returns the implementation of IWorkbenchAdapter3 for the given object. * * @param o * the object to look up. * @return IWorkbenchAdapter3 or<code>null</code> if the adapter is not * defined or the object is not adaptable. * @since 3.7 */ protected final IWorkbenchAdapter3 getAdapter3(Object o) { return Adapters.adapt(o, IWorkbenchAdapter3.class); } /** * Lazy load the resource manager * * @return The resource manager, create one if necessary */ private ResourceManager getResourceManager() { if (resourceManager == null) { resourceManager = new LocalResourceManager(JFaceResources .getResources()); } return resourceManager; } @Override public final Image getImage(Object element) { //obtain the base image by querying the element IWorkbenchAdapter adapter = getAdapter(element); if (adapter == null) { return null; } ImageDescriptor descriptor = adapter.getImageDescriptor(element); if (descriptor == null) { return null; } //add any annotations to the image descriptor descriptor = decorateImage(descriptor, element); return (Image) getResourceManager().get(descriptor); } /** * The default implementation of this returns the styled text label for the * given element. * * @param element * the element to evaluate the styled string for * * @return the styled string. * * @since 3.7 */ @Override public StyledString getStyledText(Object element) { IWorkbenchAdapter3 adapter = getAdapter3(element); if (adapter == null) { // If adapter class doesn't implement IWorkbenchAdapter3 than use // StyledString with text of element. Since the output of getText is // already decorated, so we don't need to call decorateText again // here. return new StyledString(getText(element)); } StyledString styledString = adapter.getStyledText(element); // Now, re-use any existing decorateText implementation, to decorate // this styledString. String decorated = decorateText(styledString.getString(), element); Styler styler = getDecorationStyle(element); return StyledCellLabelProvider.styleDecoratedString(decorated, styler, styledString); } /** * Sets the {@link Styler} to be used for string decorations. By default the * {@link StyledString#DECORATIONS_STYLER decoration style}. Clients can * override. * * @param element * the element that has been decorated * * @return return the decoration style * * @since 3.7 */ protected Styler getDecorationStyle(Object element) { return StyledString.DECORATIONS_STYLER; } @Override public final String getText(Object element) { //query the element for its label IWorkbenchAdapter adapter = getAdapter(element); if (adapter == null) { return ""; //$NON-NLS-1$ } String label = adapter.getLabel(element); //return the decorated label return decorateText(label, element); } @Override public Color getForeground(Object element) { return getColor(element, true); } @Override public Color getBackground(Object element) { return getColor(element, false); } @Override public Font getFont(Object element) { IWorkbenchAdapter2 adapter = getAdapter2(element); if (adapter == null) { return null; } FontData descriptor = adapter.getFont(element); if (descriptor == null) { return null; } return (Font) getResourceManager().get( FontDescriptor.createFrom(descriptor)); } private Color getColor(Object element, boolean forground) { IWorkbenchAdapter2 adapter = getAdapter2(element); if (adapter == null) { return null; } RGB descriptor = forground ? adapter.getForeground(element) : adapter .getBackground(element); if (descriptor == null) { return null; } return (Color) getResourceManager().get( ColorDescriptor.createFrom(descriptor)); } }